package ast;

import java.util.LinkedHashMap;
import java.util.List;

import visitor.Visitor;

public class TipoStruct extends AbstractTipo {
	
	public TipoStruct(String nombre){
		this.nombre=nombre;
		this.declaracionesStruct=structs.get(nombre).declaracionesStruct;
	}
	public TipoStruct(Object nombre){
		this.nombre=(String)nombre;
		this.declaracionesStruct=structs.get(this.nombre).declaracionesStruct;
	}
	public TipoStruct(String nombre,List<DeclaVariable> declaracionesStruct) {
		this.nombre = nombre;
		this.declaracionesStruct=declaracionesStruct;
		structs.put(nombre,this);
	}

	@SuppressWarnings("unchecked")
	public TipoStruct(Object nombre, Object declaracionesStruct) {
		this.nombre = (String) nombre;
		this.declaracionesStruct=(List<DeclaVariable>) declaracionesStruct;
		structs.put(this.nombre,this);
	}

	public Object accept(Visitor v, Object param) {
		return v.visit(this, param);
	}

	public boolean isPrimitivo() {
		return false;
	}
	
	@Override
	public String getNombreTipo(){
		return this.nombre;
		
	}
	@Override
	public int numeroBytes() {
		int numBytes=0;
		for(Declaracion campo: declaracionesStruct)
			numBytes+=campo.getTipo().numeroBytes();
		return numBytes;
	}
	
	public boolean equals(Object tipo){
		if(tipo instanceof TipoStruct){
			String nombre=((TipoStruct)tipo).nombre;
			if(nombre.equals(this.nombre))
				return true;
		}
		return false;
			
	}
	
	public static TipoStruct getStruct(String nombre){
		return structs.get(nombre);
	}
	public String nombre;
	public List<DeclaVariable> declaracionesStruct;
	public static LinkedHashMap<String,TipoStruct> structs=new LinkedHashMap<String,TipoStruct>();
}
